package cl.loso.melon.server.action;

import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.ServletActionContext;
import cl.loso.melon.server.model.CargoLVS;
import cl.loso.melon.server.model.GerenciaLVS;
import cl.loso.melon.server.model.NegocioLVS;
import cl.loso.melon.server.model.UsuarioLVS;
import cl.loso.melon.server.negocio.NegocioLVSBO;
import cl.loso.melon.server.negocio.UsuarioLVSBO;
import cl.loso.melon.server.persistencia.CargoLVSDAO;
import cl.loso.melon.server.persistencia.GerenciaLVSDAO;
import com.google.appengine.api.users.User;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;
import com.opensymphony.xwork2.ActionSupport;

public class UsuarioLVSAction extends ActionSupport {

	private static final long serialVersionUID = 1L;
	private static Log log = LogFactory.getLog(UsuarioLVSAction.class);
	private List<UsuarioLVS> usuarioList;
	private List<NegocioLVS> negocioList;
	private List<GerenciaLVS> gerenciaList;	
	private List<CargoLVS> cargoList;	
	private UsuarioLVS usuarioLVS;
	private String id;
	private String nombres;
	private String apepa;
	private String apema;
	private String email;
	private String perfil;
	private String meta;
	private String idNegocio;
	private String idGerencia;
	private String idCargo;

	public String authenticate() {
		String retorno = null;

		try {
			
			UserService userService = UserServiceFactory.getUserService();
			User user = userService.getCurrentUser();
			String mailusu=user.getEmail().toLowerCase();
			HttpServletRequest request = ServletActionContext.getRequest();
			log.info("el usuario " + mailusu + " esta tratando de ingresar al sistema LVS" );
			retorno = ActionSupport.SUCCESS;

			usuarioList = UsuarioLVSBO.obtenerUsuarioPorEmailLVS(mailusu);
			
			if (usuarioList != null) {
				if (!usuarioList.isEmpty()) {
					log.info("existe el usuario " + mailusu + " en la base de datos!!");
					
					usuarioLVS = usuarioList.get(0);

					if (mailusu.equals(usuarioLVS.getEmail())) {
						request.setAttribute("uid", String.valueOf(usuarioLVS
								.getId()));
						request.setAttribute("perfil", Character
								.valueOf(usuarioLVS.getPerfil()));

						log.info("usuarioLVS.getPerfil(): "
								+ usuarioLVS.getPerfil());

						retorno = ActionSupport.SUCCESS;
					} else {
						addActionError("este usuario no esta en el sistema");
						retorno = ActionSupport.ERROR;
					}
				} else {

					log.info("no existe el usuario " + mailusu + " en la base de datos!!");

					ServletContext context = ServletActionContext
							.getServletContext();
					String usuario_nombres = context
							.getInitParameter("usuario_nombres");
					String usuario_apepa = context
							.getInitParameter("usuario_apepa");
					String usuario_apema = context
							.getInitParameter("usuario_apema");
					String usuario_mail = context
							.getInitParameter("usuario_mail");
					String usuario_cargo = context
							.getInitParameter("usuario_cargo");
					String usuario_perfil = context
					.getInitParameter("usuario_perfil");

					log.info("usuario_mail:" + usuario_mail);
					log.info("mailusu:" + mailusu);

					if (mailusu.equals(usuario_mail)) {

						UsuarioLVSBO.guardarUsuarioLVS(usuario_nombres,
								usuario_apepa, usuario_apema, usuario_mail,
								usuario_perfil.charAt(0), usuario_cargo, "0", "0","0","0");
						
						UsuarioLVS usr=((UsuarioLVS)UsuarioLVSBO.obtenerUsuarioPorEmailLVS(user
								.getEmail()).get(0));

						request.setAttribute("uid", usr.getId());
						request.setAttribute("perfil", Character
								.valueOf(usr.getPerfil()));
						
						retorno = ActionSupport.SUCCESS;
					} else {
						log.error("no es el usuario adm el que intenta ingresar por primera vez");
						addActionError("el sistema no tiene datos" );
						addActionError("solo el usuario administrador (bernardo.palomo@melon.cl) puede ingresar por primera vez al sistema" );
						retorno = ActionSupport.ERROR;
					}
				}
			} else {
				log.error("no hay usuarios creados en el sistema");
				addActionError("no hay usuarios creados en el sistema" );
				retorno = ActionSupport.ERROR;			
			}

		} catch (Exception e) {
			log.error("Exception: " + e.getMessage());
			addActionError("la url correcta es: sistemalvs.appspot.com" );
			retorno = ActionSupport.ERROR;
		}

		return retorno;
	}

	public String obtenerUsuario() {
		try {
			usuarioList = UsuarioLVSBO.obtenerUsuarioLVS();
			negocioList = NegocioLVSBO.obtenerNegocioLVS();
			gerenciaList=GerenciaLVSDAO.obtener();
			cargoList=CargoLVSDAO.obtener();
		} catch (Exception e) {
			log.error(e);
		}
		return ActionSupport.SUCCESS;
	}

	public String listarUsuarioNegocio() {
		try {
			negocioList = NegocioLVSBO.obtenerNegocioLVS();
			gerenciaList=GerenciaLVSDAO.obtener();
			cargoList=CargoLVSDAO.obtener();
		} catch (Exception e) {
			log.error(e);
		}
		return ActionSupport.SUCCESS;
	}

	public String obtenerUsuarioPorNombre() {
		try {
			usuarioList = UsuarioLVSBO.obtenerUsuarioPorNombreLVS(nombres);
		} catch (Exception e) {
			log.error(e);
		}
		return ActionSupport.SUCCESS;
	}

	public String guardarUsuario() {
		try {
			String cargo=((CargoLVS)CargoLVSDAO.getCargobyId(Long.valueOf(idCargo))).getNombre();
			UsuarioLVSBO.guardarUsuarioLVS(nombres, apepa, apema, email, perfil
					.charAt(0), cargo, meta, idNegocio,idGerencia,idCargo);
		} catch (Exception e) {
			log.error(e);
		}

		return ActionSupport.SUCCESS;
	}

	public String editarUsuario() {
		try {
			usuarioLVS = UsuarioLVSBO.editarUsuarioLVS(id);
			negocioList = NegocioLVSBO.obtenerNegocioLVS();
			gerenciaList=GerenciaLVSDAO.obtener();
			cargoList=CargoLVSDAO.obtener();
		} catch (Exception e) {
			log.error(e);
		}
		return ActionSupport.SUCCESS;
	}

	public String actualizarUsuario() {
		try {
			String cargo=((CargoLVS)CargoLVSDAO.getCargobyId(Long.valueOf(idCargo))).getNombre();
			UsuarioLVSBO.actualizarUsuarioLVS(id, nombres, apepa, apema, email,
					perfil.charAt(0), cargo, meta, idNegocio,idGerencia,idCargo);
		} catch (Exception e) {
			log.error(e);
		}

		return ActionSupport.SUCCESS;
	}

	public String borrarUsuario() {
		try {
			UsuarioLVSBO.borrarUsuarioLVS(id);
		} catch (Exception e) {
			log.error(e);
		}
		return ActionSupport.SUCCESS;
	}

	public String existeUsuario() {
		try {
			usuarioList = UsuarioLVSBO.obtenerUsuarioPorEmailLVS(email);
			if (!usuarioList.isEmpty()) {
				usuarioLVS = usuarioList.get(0);
			}
		} catch (Exception e) {
			log.error(e);
		}
		return ActionSupport.SUCCESS;
	}

	public List<UsuarioLVS> getUsuarioList() {
		return usuarioList;
	}

	public void setUsuarioList(List<UsuarioLVS> usuarioList) {
		this.usuarioList = usuarioList;
	}

	public UsuarioLVS getUsuarioLVS() {
		return usuarioLVS;
	}

	public void setUsuarioLVS(UsuarioLVS usuarioLVS) {
		this.usuarioLVS = usuarioLVS;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getNombres() {
		return nombres;
	}

	public void setNombres(String nombres) {
		this.nombres = nombres;
	}

	public String getApepa() {
		return apepa;
	}

	public void setApepa(String apepa) {
		this.apepa = apepa;
	}

	public String getApema() {
		return apema;
	}

	public void setApema(String apema) {
		this.apema = apema;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getPerfil() {
		return perfil;
	}

	public void setPerfil(String perfil) {
		this.perfil = perfil;
	}

	public String getMeta() {
		return meta;
	}

	public void setMeta(String meta) {
		this.meta = meta;
	}

	public List<NegocioLVS> getNegocioList() {
		return negocioList;
	}

	public void setNegocioList(List<NegocioLVS> negocioList) {
		this.negocioList = negocioList;
	}

	public String getIdNegocio() {
		return idNegocio;
	}

	public void setIdNegocio(String idNegocio) {
		this.idNegocio = idNegocio;
	}

	public List<GerenciaLVS> getGerenciaList() {
		return gerenciaList;
	}

	public void setGerenciaList(List<GerenciaLVS> gerenciaList) {
		this.gerenciaList = gerenciaList;
	}

	public String getIdGerencia() {
		return idGerencia;
	}

	public void setIdGerencia(String idGerencia) {
		this.idGerencia = idGerencia;
	}

	public List<CargoLVS> getCargoList() {
		return cargoList;
	}

	public void setCargoList(List<CargoLVS> cargoList) {
		this.cargoList = cargoList;
	}

	public String getIdCargo() {
		return idCargo;
	}

	public void setIdCargo(String idCargo) {
		this.idCargo = idCargo;
	}


}
